home *** CD-ROM | disk | FTP | other *** search
- ; SETJMP.ASM -- asm support routines for turbo pascal setjmp/jmpback
- ; (designed to support overlayed units)
- ; Author: David Stephens, compuserve 71621,2210
- ; april/91
-
- CODE SEGMENT
- assume cs:code
-
- ;TYPE
- ; jmpBufType = record
- ; localCS : function:word;
- ; ss,sp,bp : word;
- ; ip,cs : word;
- ; end;
- ;
- ;function setjmp(VAR buf:jmpBufType; localCS:function):integer;
- ;procedure jmpback(VAR buf:jmpBufType; ret:integer);
- ;
- ; NOTE: (the value of jmpBufType.cs is found by calling the
- ; localCS function when jmpback is called).
-
-
-
- BUF EQU [BP+10]
- FUNC EQU [BP+6]
- CSx EQU [BP+4]
- IPx EQU [BP+2]
-
- PUBLIC setjmp,jmpBack
-
- setjmp proc far
- ;calc store "runtime environment:" ss,sp, 'cs',ip, bp.
- ;(from the tp documentation, and testing, these appear to be the only
- ; registers that need to be preserved).
-
- mov cx,bp ;grab the current bp
- push bp ;setup stack frame
- mov bp,sp
- push ds ;save pascal data seg
-
- cld
- les di,BUF ;set ES:DI = ptr to jmpbufType
- lds ax,FUNC ;set DS:AX = address of unit's localCS function
-
- stosw ;move localCS function adr to jmpbuf
- mov ax,ds
- stosw
-
- mov ax,ss ;move stack adr to jmpbuf
- stosw ; store SS
- mov ax,bp ; calc SP for jmpbuf:
- add ax,14 ; (8 bytes params+CSx+IPx+bp = 14 bytes)
- stosw ; store SP
-
- mov ax,cx
- stosw ;store BP to jmpbuf
-
- mov ax,IPx
- stosw ;store IP
-
- mov ax,0 ;function return value = 0
-
- pop ds
- mov sp,bp
- pop bp
- ret 8
- setjmp ENDP
-
-
- BUF2 EQU [BP+8]
- retCode EQU [BP+6]
-
- jmpBack proc far
- push bp
- mov bp,sp
-
- les di,BUF2 ;ES:DI = ptr to jmpBuf
- call dword ptr es:[di] ;call localCS adr stored in jmpBuf!
- ;this faults in ovrly, and returns
- ;CS of overlayed unit in AX
- cld
-
- les di,BUF2 ;ES:DI = ptr jmpBuf again (setup for stosw)
- add di,12 ;skip to jmpbuf.cs in jmpbuf
- stosw ;store the now known CS value
-
- mov dx,ds ;keep pascal DS in DX
- mov cx,retCode ;keep return code in CX
-
- lds si,BUF2 ;DS:SI = ptr to jmpbuf (for lodsw)
- add si,4 ;skip jmpBuf.localCS
-
- ;restore stack:
- lodsw ; AX = stackseg
- mov bx,ax
- lodsw ; AX = stackptr
- mov ss,bx
- mov sp,ax ; note: cli/sti not needed
-
- lodsw
- mov bp,ax ;restore BP
-
- mov ax,cx ;set return value
- mov ds,dx ;restore pascal DS
-
- jmp DWORD PTR es:[si] ;jmp to the now current CS:IP
-
- jmpBack endp
-
-
-
- CODE ENDS
- END
-
- ;ignore ambifluous information <smile>.